%%
%% This is file `xeCJK.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% xeCJK.dtx  (with options: `xeCJK')
%% 
%%  Version 2.3.15 (31-May-2010)
%% 
%%  Copyright (C) Wenchang Sun <sunwch@hotmail.com>
%% 
%%  This file may be distributed and/or modified under the
%%  conditions of the LaTeX Project Public License, either version 1.3
%%  of this license or (at your option) any later version.
%%  The latest version of this license is in
%%    http://www.latex-project.org/lppl.txt
%%  and version 1.3 or later is part of all distributions of LaTeX
%%  version 2005/12/01 or later.
%% 
\def\fileversion{2.3.15}
\def\filedate{2010/05/31}
\ProvidesPackage{xeCJK}[\filedate\space\fileversion\space package for typesetting CJK scripts with XeLaTeX]
\RequirePackage{ifxetex}
\RequireXeTeX
\expandafter\def\csname ver@CJK.sty\endcsname{2020/01/01}

\newif\ifxeCJK@SlantFont@
\xeCJK@SlantFont@false

\newif\ifxeCJK@BoldFont@
\xeCJK@BoldFont@false

\newif\ifxeCJK@num
\xeCJK@numfalse

\newif\ifxeCJK@checksingle
\xeCJK@checksinglefalse

\newif\ifxeCJK@indentfirst
\xeCJK@indentfirsttrue

\DeclareOption{boldfont}{\xeCJK@BoldFont@true}
\DeclareOption{BoldFont}{\ExecuteOptions{boldfont}}
\DeclareOption{slantfont}{\xeCJK@SlantFont@true}
\DeclareOption{SlantFont}{\ExecuteOptions{slantfont}}
\DeclareOption{CJKnumber}{\xeCJK@numtrue}
\DeclareOption{normalindentfirst}{\xeCJK@indentfirstfalse}
\DeclareOption{CJKnormalspaces}{}
\DeclareOption{CJKaddspaces}{}
\DeclareOption{CJKtextspaces}{}
\DeclareOption{CJKmathspaces}{}
\DeclareOption{CJKsetspaces}{}
\DeclareOption{CJKnospaces}{}
\DeclareOption{CJKchecksingle}{\AtEndOfPackage{\let\xeCJK@i@i\xeCJK@checksingle}}
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{fontspec}}
\ProcessOptions\relax

\RequirePackage{fontspec}
\relax

\ifxeCJK@indentfirst
  \let\@afterindentfalse\relax
\fi
\endlinechar \m@ne
\def\makexeCJKactive{
  \XeTeXinterchartokenstate=1\relax}

\def\makexeCJKinactive{
  \XeTeXinterchartokenstate=0\relax}

\makexeCJKactive

\def\xeCJKsetcharclass#1#2#3{
  \@tempcnta=#1
  \loop
    \XeTeXcharclass \@tempcnta #3\relax
    \advance\@tempcnta 1\relax
    \ifnum\the\@tempcnta<#2 \repeat
  \xeCJK@setpunctcharclass}

\def\xeCJK@prePunct#1#2{\xeCJK@setPunct{2}{#1}{#2}}
\def\xeCJK@postPunct#1#2{\xeCJK@setPunct{3}{#1}{#2}}

\def\xeCJK@setPunct#1#2#3{
  \def\xeCJK@class{#1}
  \@tempcnta "#2\relax
  \multiply\@tempcnta 256\relax
  \xeCJK@setPunct@#3,,}

\def\xeCJK@setPunct@#1,{
  \edef\xeCJK@temp{#1}%
  \ifx\xeCJK@temp\@empty
  \else
     \@tempcntb "#1\relax
     \advance\@tempcntb\@tempcnta\relax
     \XeTeXcharclass \@tempcntb=\xeCJK@class\relax
     \def\xeCJK@temp{\xeCJK@setPunct@}
  \fi
  \xeCJK@temp}

\def\xeCJK@setpunctcharclass{
  \xeCJK@prePunct{20}{18,1C}
  \xeCJK@postPunct{20}{19,1D,14,26}
  \xeCJK@postPunct{25}{00}
  \xeCJK@prePunct{30}{08,0A,0C,0E,10,12,14,16,18,1A,1D,1F,36}

  \xeCJK@postPunct{30}{01,02,05,06,09,0B,0D,0F,11,15,17,19,1B,1E,
                     41,43,45,47,49,63,83,85,87,8E,
                     9B,9C,9D,9E,A1,A3,A5,A7,A9,C3,E3,E5,E7,EE,F5,F6,FB,FC,FD,FE}
  \xeCJK@prePunct {FE}{59,5B,5D,5F,60,69,6B}
  \xeCJK@postPunct{FE}{50,51,52,54,55,56,57,5A,5C,5E,6A}
  \xeCJK@prePunct {FF}{03,04,08,20,3B,5B,E0,E1,E5,E6}
  \xeCJK@postPunct{FF}{01,05,09,0C,0E,1A,1B,1F,3D,5D,
                     61,63,64,65,67,68,69,6A,6B,6C,6D,6E,6F,70,9E,9F}

  \xeCJK@setPunct{4}{0}{28,2D,5B,60,7B}
  \xeCJK@setPunct{5}{0}{21,22,25,27,29,2C,2E,3A,3B,3F,5D,7D}}

\xeCJKsetcharclass{"2000}{"FFFF}{1}

\def\CJK@stop{\CJK@stop}

\def\normalspacedchars#1{
  \xeCJK@setnormalspacedchar#1\CJK@stop}

\def\xeCJK@setnormalspacedchar#1{
  \ifx#1\CJK@stop
  \else
    \XeTeXcharclass`#1=6
    \expandafter\xeCJK@setnormalspacedchar
  \fi}

\normalspacedchars{/}

\XeTeXinterchartoks 1 0{\egroup\CJKecglue}
\XeTeXinterchartoks 1 1{\xeCJK@i@i}
\XeTeXinterchartoks 1 2{\xeCJK@i@ii}
\XeTeXinterchartoks 1 3{\xeCJK@i@iii}
\XeTeXinterchartoks 1 4{\egroup\CJKecglue}
\XeTeXinterchartoks 1 5{\egroup}
\XeTeXinterchartoks 1 255{\xeCJK@i@cclv}

\XeTeXinterchartoks 2 0{\xeCJK@ii@}
\XeTeXinterchartoks 2 1{\xeCJK@ii@i}
\XeTeXinterchartoks 2 2{\xeCJK@ii@ii}
\XeTeXinterchartoks 2 3{\xeCJK@ii@iii}
\XeTeXinterchartoks 2 4{\xeCJK@ii@iv}
\XeTeXinterchartoks 2 5{\xeCJK@ii@v}
\XeTeXinterchartoks 2 255{\xeCJK@ii@cclv}

\XeTeXinterchartoks 3 0{\xeCJK@iii@}
\XeTeXinterchartoks 3 1{\xeCJK@iii@i}
\XeTeXinterchartoks 3 2{\xeCJK@iii@ii}
\XeTeXinterchartoks 3 3{\xeCJK@iii@iii}
\XeTeXinterchartoks 3 4{\xeCJK@iii@iv}
\XeTeXinterchartoks 3 5{\xeCJK@iii@v}
\XeTeXinterchartoks 3 255{\xeCJK@iii@cclv}

\XeTeXinterchartoks 0 1{\xeCJK@@i}
\XeTeXinterchartoks 0 2{\xeCJK@@ii}
\XeTeXinterchartoks 0 3{\xeCJK@@iii}
\XeTeXinterchartoks 0 255{\xeCJK@@cclv}

\XeTeXinterchartoks 4 1{\xeCJK@iv@i}
\XeTeXinterchartoks 4 2{\xeCJK@iv@ii}
\XeTeXinterchartoks 4 3{\xeCJK@iv@iii}

\XeTeXinterchartoks 5 1{\xeCJK@v@i}
\XeTeXinterchartoks 5 2{\xeCJK@v@ii}
\XeTeXinterchartoks 5 3{\xeCJK@v@iii}
\XeTeXinterchartoks 5 255{\xeCJK@v@cclv}

\XeTeXinterchartoks 255 0{\xeCJK@cclv@}
\XeTeXinterchartoks 255 1{\xeCJK@cclv@i}
\XeTeXinterchartoks 255 2{\xeCJK@cclv@ii}
\XeTeXinterchartoks 255 3{\xeCJK@cclv@iii}
\XeTeXinterchartoks 255 4{\xeCJK@cclv@iv}

\XeTeXinterchartoks 1 6{\xeCJK@i@vi}
\XeTeXinterchartoks 6 1{\xeCJK@vi@i}

\def\xeCJK@vi@i{
  \bgroup
  \xeCJK@emptyCJKtoks
  \xeCJK@setfont
  \CJKsymbol}

\def\xeCJK@i@vi{
  \egroup}

\def\xeCJK@i@i{
  \CJKglue
  \CJKsymbol}

\def\xeCJK@i@ii#1{
  \xeCJK@punctrule{#1}{l}
  \hskip \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @lglue@#1\endcsname
    plus 0.1em minus 0.1 em
  \xeCJK@setprepunct{#1}}

\def\xeCJK@i@iii#1{
  \xeCJK@punctrule{#1}{r}
  \ifcsname xeCJK@specialpunct#1\endcsname
    \CJKglue % breakable
  \else
    \nobreak
  \fi
  \global\edef\xeCJK@lastpunct{#1}
  \CJKpunctsymbol{#1}}

\def\xeCJK@setprepunct#1{
  \edef\xeCJK@lastpunct{#1}
  \vrule width \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname
    @lrule@#1\endcsname depth \z@ height \z@
  \CJKpunctsymbol{#1}}

\def\xeCJK@i@cclv{
  \egroup
  {\xeCJK@CJKkern}
  \xeCJK@ignorespaces}

\def\xeCJK@ii@i{
  \nobreak
  \CJKsymbol}

\def\xeCJK@ii@ii#1{
  \nobreak
  \xeCJK@punctrule{#1}{l}
  \xeCJK@setkern{\xeCJK@lastpunct}{#1}
  \kern \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern\xeCJK@lastpunct#1\endcsname
  \xeCJK@setprepunct{#1}}

\def\xeCJK@ii@iii#1{
  \nobreak
  \xeCJK@punctrule{#1}{r}
  \xeCJK@setkern{\xeCJK@lastpunct}{#1}
  \kern \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern\xeCJK@lastpunct#1\endcsname
  \nobreak
  \edef\xeCJK@lastpunct{#1}
  \CJKpunctsymbol{#1}}

\def\xeCJK@ii@{
  \nobreak
  \egroup}

\let\xeCJK@ii@iv\xeCJK@ii@
\let\xeCJK@ii@v\xeCJK@ii@

\def\xeCJK@ii@cclv{
  \nobreak
  \egroup
  \ignorespaces}

\def\xeCJK@iii@{
  \xeCJK@afterpostpunct
  \egroup}

\def\xeCJK@iii@i{
  \xeCJK@afterpostpunct
  \CJKsymbol}

\def\xeCJK@iii@ii#1{
  \vrule width \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname
     @rrule@\xeCJK@lastpunct\endcsname depth \z@ height \z@
  \xeCJK@punctrule{#1}{l}
  \xeCJK@setkern{\xeCJK@lastpunct}{#1}
  \kern \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern\xeCJK@lastpunct#1\endcsname
  \xeCJKpunctnobreak
  \xeCJK@setprepunct{#1}}

\def\xeCJK@iii@iii#1{
  \vrule width \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname
     @rrule@\xeCJK@lastpunct\endcsname depth \z@ height \z@
  \xeCJK@punctrule{#1}{r}
  \xeCJK@setkern{\xeCJK@lastpunct}{#1}
  \kern \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern\xeCJK@lastpunct#1\endcsname
  \nobreak
  \edef\xeCJK@lastpunct{#1}
  \CJKpunctsymbol{#1}}

\def\xeCJK@iii@iv{
  \xeCJK@afterpostpunct
  \egroup}

\def\xeCJK@afterpostpunct{
  \vrule width \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname
     @rrule@\xeCJK@lastpunct\endcsname depth \z@ height \z@
  \hskip \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @rglue@\xeCJK@lastpunct\endcsname
    plus 0.1em minus 0.1 em}
\let\xeCJK@iii@v\xeCJK@iii@iv

\def\xeCJK@iii@cclv{
    \xeCJK@afterpostpunct
    \egroup
    \expandafter\xeCJK@ignorespaces}

\def\xeCJK@@i{
  \CJKecglue
  \bgroup
  \xeCJK@setfont
  \xeCJK@emptyCJKtoks
  \CJKsymbol}

\def\xeCJK@@ii{
  \bgroup
  \xeCJK@setfont
  \XeTeXinterchartoks 0   2{\relax}
  \xeCJK@emptyCJKtoks
  \xeCJK@i@ii}

\def\xeCJK@@iii{
  \bgroup
  \xeCJK@setfont
  \XeTeXinterchartoks 0   3{\relax}
  \xeCJK@emptyCJKtoks
  \xeCJK@i@iii}

\def\xeCJK@iv@i{
  \bgroup
  \xeCJK@setfont
  \XeTeXinterchartoks 4 1{\relax}
  \xeCJK@emptyCJKtoks
  \CJKsymbol}

\def\xeCJK@iv@ii{
  \bgroup
  \xeCJK@setfont
  \XeTeXinterchartoks 4 2{\relax}
  \xeCJK@emptyCJKtoks
  \xeCJK@i@ii}

\def\xeCJK@iv@iii{
  \bgroup
  \xeCJK@setfont
  \XeTeXinterchartoks 4 3{\relax}
  \xeCJK@emptyCJKtoks
  \xeCJK@i@iii}

\def\xeCJK@v@i{
  \CJKecglue
  \bgroup
  \xeCJK@setfont
  \xeCJK@emptyCJKtoks
  \CJKsymbol}

\def\xeCJK@v@ii{
  \bgroup
  \xeCJK@setfont
  \XeTeXinterchartoks 5 2{\relax}
  \xeCJK@emptyCJKtoks
  \xeCJK@i@ii}

\def\xeCJK@v@iii{
  \bgroup
  \xeCJK@setfont
  \XeTeXinterchartoks 5 3{\relax}
  \xeCJK@emptyCJKtoks
  \xeCJK@i@iii}

\def\xeCJK@emptyCJKtoks{
  \XeTeXinterchartoks 255 1{\relax}
  \XeTeXinterchartoks 255 2{\relax}
  \XeTeXinterchartoks 255 3{\relax}}

\def\xeCJK@@cclv{
  \futurelet\xeCJK@nexttoken\xeCJK@zz@cclv}

\def\xeCJK@zz@cclv{
  \ifx\xeCJK@nexttoken\@sptoken
  \else
    {\xeCJK@zerokern}
  \fi}

\let\xeCJK@v@cclv\xeCJK@@cclv

\def\xeCJK@cclv@{
  \ifnum\lastkern=\@ne
    \@sptoken%\CJKecglue
  \fi}
\let\xeCJK@cclv@iv\xeCJK@cclv@

\def\xeCJK@cclv@i{{
  \ifnum\lastkern=\@ne
    \CJKglue
  \else
    \ifnum\lastkern=\xeCJK@four
      \@sptoken%\CJKecglue
    \else
      \ifnum\lastnodetype=\xeCJK@ten
        \CJKecglue
      \fi
    \fi
  \fi}
  \bgroup

  \xeCJK@emptyCJKtoks
  \xeCJK@setfont
  \CJKsymbol}

\def\xeCJK@cclv@ii{
  \bgroup
  \xeCJK@emptyCJKtoks
  \xeCJK@setfont
  \xeCJK@i@ii}

\def\xeCJK@cclv@iii{
  \bgroup
  \xeCJK@emptyCJKtoks
  \xeCJK@setfont
  \xeCJK@i@iii}

\def\CJKglue{\hskip \z@ \@plus .08\baselineskip}
\def\CJK@nobreakglue{\nobreak\CJKglue\nobreak}

\edef\xeCJK@CJKkern{\kern -1sp\kern 1sp}
\edef\xeCJK@prepunctkern{\kern -2sp\kern 2sp}
\edef\xeCJK@zerokern{\kern -4sp\kern 4sp}

\chardef\xeCJK@four=4
\chardef\xeCJK@ten=10

\def\xeCJK@ignorespaces{
  \futurelet\xeCJK@nexttoken\xeCJK@checknext}

\def\xeCJK@checknext{
  \ifx\xeCJK@nexttoken\@sptoken
    \expandafter\xeCJK@@checknext
  \else
    \ifx $\xeCJK@nexttoken
      \CJKecglue
    \fi
  \fi}

{
  \def\:{\xeCJK@@checknext}
  \global\expandafter\def\: {\futurelet\@let@token\xeCJK@@@checknext}
}

\def\xeCJK@@@checknext{
  \ifx $\@let@token
    \@sptoken%\CJKecglue
  \else
    \if\relax\noexpand\@let@token
      \ifx\@let@token\xeCJK@par
      \else
        \@sptoken
      \fi
    \fi
  \fi
  \let\xeCJK@nexttoken\relax}

\long\def\xeCJK@gobble#1\CJK@stop{}


\def\xeCJK@checksingle#1{
  \def\xeCJK@setcurrentchar@i{
    \CJKglue
    \CJKsymbol{#1}}
  \def\xeCJK@setcurrentnobreakchar@i{
    \CJKsymbol{#1}}
  \futurelet\@let@token\xeCJK@@checksingle}

\def\xeCJK@@checksingle{
  \ifcat 。\noexpand\@let@token
    \expandafter\xeCJK@@@checksingle
  \else
    \expandafter\xeCJK@setcurrentchar@i
  \fi}

\def\xeCJK@@@checksingle#1{
  \def\xeCJK@setcurrentchar@ii{
    \xeCJK@setcurrentchar@i #1}
  \def\xeCJK@setcurrentchar@ii@s{
    \xeCJK@setcurrentchar@i #1 }
  \def\xeCJK@setcurrentnobreakchar@ii{
    \xeCJK@setcurrentnobreakchar@i #1}
  \futurelet\@let@token\xeCJK@@@@checksingle}

\def\xeCJK@@@@checksingle{
  \ifx\@let@token\@sptoken
    \expandafter\xeCJK@checkpar
  \else
    \expandafter\xeCJK@setcurrentchar@ii
  \fi}

\let\xeCJK@par\par
\def\xeCJK@checkpar{
  \@ifnextchar\xeCJK@par{\xeCJK@setcurrentnobreakchar@ii}{\xeCJK@setcurrentchar@ii@s}}

\def\xeCJKsetecglue#1{
    \def\CJK@ecglue{#1}
    \let\CJKecglue\CJK@ecglue}
\let\CJKsetecglue\xeCJKsetecglue
\CJKsetecglue{ }

\def\xeCJKallowbreakbetweenpuncts{
  \def\xeCJKpunctnobreak{
    \hskip 0pt}}

\def\xeCJKnobreakbetweenpuncts{
  \let\xeCJKpunctnobreak\nobreak}
\xeCJKnobreakbetweenpuncts

\let\xeCJK@itcorr\/
\def\/{%
  \relax
  \ifnum\lastkern=4 %
    \unkern\unkern
  \fi
  \xeCJK@itcorr}
\let\@@italiccorr=\/

\newcount\xeCJK@cnta
\newcount\xeCJK@cntb
\newcount\xeCJK@cntc
\newcount\xeCJK@cntd
\newcount\xeCJK@cnte
\newdimen\xeCJK@dima
\newif\ifxeCJK@dokerning

\def\xeCJK@punctrule#1#2{
  \xdef\xeCJK@bboxname{\xeCJK@family/\f@series/\f@shape}
  \ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @#2rule@#1\endcsname
  \else
    \ifcsname xeCJK@\xeCJK@bboxname @lspace@#1\endcsname
    \else
      {\xeCJK@setfont
       \xeCJK@setpunctbounds{#1}}
    \fi
    \xeCJK@dokerningtrue
    \ifnum\xeCJK@punctstyle=\xeCJK@ps@plain\relax
      \xeCJK@dokerningfalse
    \else
      \ifcsname xeCJK@specialpunct#1\endcsname
        \xeCJK@dokerningfalse
      \fi
    \fi
    \ifxeCJK@dokerning
      \xeCJK@cnta=\csname xeCJK@\xeCJK@bboxname @#2space@#1\endcsname\relax
      \xeCJK@cntc=\xeCJK@cnta
      \ifcase\xeCJK@punctstyle
          % hangmobanjiao
      \or % quanjiao
      \or % banjiao
        \advance\xeCJK@cntc -50\relax
      \or % kaiming
        \ifcsname xeCJK@kaiming#1\endcsname
        \else
          \advance\xeCJK@cntc -50\relax
        \fi
      \or %CCT
        \advance\xeCJK@cntc -20\relax
      \fi
      \xeCJK@cntd=\xeCJK@cntc
      \ifnum\xeCJK@cntc<0\relax
        \xeCJK@cntc=0\relax
      \fi
    \else
      \xeCJK@cnta=0\relax
      \xeCJK@cntc=0\relax
      \xeCJK@cntd=0\relax
    \fi
    \xeCJK@numtodim{\xeCJK@cnta}
    \global\expandafter\edef\csname
      xeCJK\xeCJK@punctstyle\xeCJK@bboxname @#2rule@#1\endcsname{
        -\xeCJK@temp em}
    \xeCJK@numtodim{\xeCJK@cntc}
    \global\expandafter\edef\csname
      xeCJK\xeCJK@punctstyle\xeCJK@bboxname @#2glue@#1\endcsname{
        \xeCJK@temp em}
    \global\expandafter\edef\csname
      xeCJK\xeCJK@punctstyle\xeCJK@bboxname @#2oglue@#1\endcsname{
        \the\xeCJK@cntd}
  \fi}

\def\xeCJK@numtodim#1{
  \xeCJK@cnte=#1\relax
  \ifnum\the\xeCJK@cnte<100\relax
    \def\xeCJK@temp{0}
  \else
    \advance\xeCJK@cnte -100\relax
    \def\xeCJK@temp{1}
  \fi
  \ifnum\the\xeCJK@cnte<10
    \edef\xeCJK@temp{\xeCJK@temp.0\the\xeCJK@cnte}
  \else
    \edef\xeCJK@temp{\xeCJK@temp.\the\xeCJK@cnte}
  \fi}

\expandafter\def\csname xeCJK@kaiming。\endcsname{}
\expandafter\def\csname xeCJK@kaiming？\endcsname{}
\expandafter\def\csname xeCJK@kaiming！\endcsname{}
\expandafter\def\csname xeCJK@specialpunct—\endcsname{}% U+2014
\expandafter\def\csname xeCJK@specialpunct─\endcsname{}% U+2500
\expandafter\def\csname xeCJK@specialpunct…\endcsname{}
\def\xeCJK@setkern#1#2{
  \ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern#1#2\endcsname
  \else
    \xeCJK@cnta=0\relax
    \ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @roglue@#1\endcsname
      \advance\xeCJK@cnta\csname
        xeCJK\xeCJK@punctstyle\xeCJK@bboxname @roglue@#1\endcsname
    \fi
    \ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @loglue@#2\endcsname
      \advance\xeCJK@cnta\csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname
        @loglue@#2\endcsname
    \fi
    \relax
    \ifcase\xeCJK@punctstyle
        % hangmobanjiao
    \or % quanjiao
      \advance\xeCJK@cnta -50\relax
    \or % banjiao
    \or % kaiming
      \ifcsname xeCJK@kaiming#1\endcsname
        \ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @roglue@#2\endcsname
          \advance\xeCJK@cnta -50\relax
        \fi
      \fi
    \fi
    \ifnum\xeCJK@cnta<0\relax
      \xeCJK@cnta=0\relax
    \fi
    \xeCJK@numtodim{\xeCJK@cnta}
    \global\expandafter\edef\csname
      xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern#1#2\endcsname{
        \xeCJK@temp em}
  \fi}

\def\xeCJKsetkern#1#2#3{
  \xdef\xeCJK@bboxname{\xeCJK@family/\f@series/\f@shape}
  \global\expandafter\edef\csname
      xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern#1#2\endcsname{#3}}

\def\punctstyle#1{
  \ifcsname xeCJK@ps@#1\endcsname
    \edef\xeCJK@punctstyle{\csname xeCJK@ps@#1\endcsname}
    \ifnum\xeCJK@punctstyle=\xeCJK@ps@plain\relax
      \xeCJKallowbreakbetweenpuncts
    \fi
  \else
    \typeout{Warning: Punctstyle #1\space is not defined.}
  \fi}

\def\xeCJK@ps@hangmobanjiao{0}
\def\xeCJK@ps@marginkerning{0}
\def\xeCJK@ps@quanjiao{1}
\def\xeCJK@ps@fullwidth{1}
\def\xeCJK@ps@banjiao{2}
\def\xeCJK@ps@halfwidth{2}
\def\xeCJK@ps@kaiming{3}
\def\xeCJK@ps@mixedwidth{3}
\def\xeCJK@ps@CCT{4}
\def\xeCJK@ps@plain{5}
\punctstyle{quanjiao}

\def\xeCJKplainchr{\punctstyle{plain}}

\def\xeCJK@sidespace{10}

\def\xeCJK@getglyphbounds#1{
  \xeCJK@cnta=\number\XeTeXglyphbounds #1 \xeCJK@gid
  \xeCJK@dima 1em\relax
  \xeCJK@cntb=\number\xeCJK@dima
  \multiply\xeCJK@cnta 100\relax
  \divide\xeCJK@cnta\xeCJK@cntb
  \advance\xeCJK@cnta -15\relax
  \edef\xeCJK@temp{\the\xeCJK@cnta}
  \ifnum\xeCJK@temp<0\relax
    \def\xeCJK@temp{0}
  \fi}

\def\xeCJK@setpunctbounds#1{
  \edef\xeCJK@gid{\the\XeTeXcharglyph`#1}
  \xeCJK@getglyphbounds{1}
  \expandafter\xdef\csname xeCJK@\xeCJK@bboxname @lspace@#1\endcsname{
    \xeCJK@temp}
  \xeCJK@getglyphbounds{3}
  \expandafter\xdef\csname xeCJK@\xeCJK@bboxname @rspace@#1\endcsname{
    \xeCJK@temp}
  \ifcsname xeCJK@specialpunct#1\endcsname
    \ifx#1…
    \else
      \xeCJK@cnta=\number\XeTeXglyphbounds 1 \xeCJK@gid
      \advance\xeCJK@cnta\number\XeTeXglyphbounds 3 \xeCJK@gid
      \xeCJK@dima 1em\relax
      \xeCJK@cntb=\number\xeCJK@dima
      \multiply\xeCJK@cnta 100\relax
      \divide\xeCJK@cnta\xeCJK@cntb
      \advance\xeCJK@cnta 1\relax
      \ifnum\xeCJK@cnta>9
        \edef\xeCJK@temp{-0.\the\xeCJK@cnta em}
      \else
        \ifnum\xeCJK@cnta>1
          \edef\xeCJK@temp{-0.0\the\xeCJK@cnta em}
        \else
          \edef\xeCJK@temp{-0.01 em}
        \fi
      \fi
      \xeCJK@cnta=0
      \loop
        \global\expandafter\edef\csname xeCJK\the\xeCJK@cnta\xeCJK@bboxname
          @kern#1#1\endcsname{\xeCJK@temp}
        \advance \xeCJK@cnta 1\relax
      \ifnum\xeCJK@cnta<6\repeat
    \fi
  \fi}

\ifcsname XeTeXglyphbounds\endcsname
\else
  \PackageError{xeCJK}{\string\XeTeXglyphbounds \space not defined.^^J
    You have to update XeTeX  to the version 0.9995.0 or later}
    \relax
\fi

\def\CJKsymbol#1{#1}
\def\CJKpunctsymbol#1{#1}

\DeclareRobustCommand{\xeCJK@ULprepunctchar}[1]{
 {\XeTeXinterchartokenstate=0
  \CJKpunctsymbol{#1}
  \nobreak}
  \ignorespaces}
\DeclareRobustCommand{\xeCJK@ULpostpunctchar}[1]{
 {\XeTeXinterchartokenstate=0
  \CJKpunctsymbol{#1}}
  \xeCJK@ignorespaces}
\def\xeCJK@ULroutines{
  \XeTeXinterchartoks 0   1 {\CJKecglue\CJKsymbol}
  \XeTeXinterchartoks 4   1 {\CJKsymbol}
  \XeTeXinterchartoks 5   1 {\CJKecglue\CJKsymbol}
  \XeTeXinterchartoks 255 1 {\xeCJK@cclv@i}
  \XeTeXinterchartoks 0   2 {\xeCJK@ULprepunctchar}
  \XeTeXinterchartoks 4   2 {\xeCJK@ULprepunctchar}
  \XeTeXinterchartoks 5   2 {\xeCJK@ULprepunctchar}
  \XeTeXinterchartoks 255 2 {\xeCJK@ULprepunctchar}
  \XeTeXinterchartoks 0   3 {\xeCJK@ULpostpunctchar}
  \XeTeXinterchartoks 4   3 {\xeCJK@ULpostpunctchar}
  \XeTeXinterchartoks 5   3 {\xeCJK@ULpostpunctchar}
  \XeTeXinterchartoks 255 3 {\xeCJK@ULpostpunctchar}}

\AtBeginDocument{
  \ifcsname UL@hook\endcsname
    \addto@hook\UL@hook{
      \def\CJKsymbol#1{{\xeCJK@setfont #1}\kern -1sp\kern 1sp\xeCJK@ignorespaces}
      \def\CJKpunctsymbol#1{{\xeCJK@setfont #1}}
      \xeCJK@ULroutines}
  \fi
  \ifcsname ver@CJKfntef.sty\endcsname
    \def\XeTeX@CJKfntef@hook{
      \xeCJK@setfont
      \XeTeXinterchartokenstate=0}
  \fi}

\def\xeCJK@setfont{
  \ifcsname\xeCJK@family/\f@series/\f@shape/\f@size\endcsname
    \csname\xeCJK@family/\f@series/\f@shape/\f@size\endcsname
  \else
    \csname xeCJK@font@\xeCJK@family\endcsname
    \get@external@font
    \expandafter\global\expandafter\font
     \csname\xeCJK@family/\f@series/\f@shape/\f@size\endcsname=\external@font
  \fi}

\def\setCJKmainfont{
  \xeCJK@newfontfamily{rm}}

\let\setCJKromanfont\setCJKmainfont

\def\setCJKsansfont{
  \xeCJK@newfontfamily{sf}}

\def\setCJKmonofont{
  \xeCJK@newfontfamily{tt}}

\def\setCJKfamilyfont#1{
  \xeCJK@newfontfamily{#1}}
\DeclareRobustCommand\normalfont
        {\CJKfamily{rm}%
         \usefont\encodingdefault
                 \familydefault
                 \seriesdefault
                 \shapedefault
         \relax}
\let\reset@font\normalfont

\DeclareRobustCommand\rmfamily
        {\not@math@alphabet\rmfamily\mathrm
         \fontfamily\rmdefault\CJKfamily{rm}\selectfont}

\DeclareRobustCommand\sffamily
        {\not@math@alphabet\sffamily\mathsf
         \fontfamily\sfdefault\CJKfamily{sf}\selectfont}

\DeclareRobustCommand\ttfamily
        {\not@math@alphabet\ttfamily\mathtt
         \fontfamily\ttdefault\CJKfamily{tt}\selectfont}
\newcommand*\xeCJK@newfontfamily[1]{
  \@ifnextchar[
    {\xeCJK@newfontfamily@{#1}}
    {\xeCJK@newfontfamily@{#1}[]}}

\def\xeCJK@setmacro@define@key#1{
  \define@key[xeCJK]{preparse}{#1}{
    \expandafter\xdef\csname xeCJK@#1\endcsname{##1}}}

\xeCJK@setmacro@define@key{ItalicFont}
\xeCJK@setmacro@define@key{BoldFont}
\xeCJK@setmacro@define@key{BoldItalicFont}

\def\xeCJK@newfontfamily@#1[#2]#3{
  %
  % Get user defined options

  \let\xeCJK@BoldFont\@empty
  \let\xeCJK@ItalicFont\@empty
  \let\xeCJK@BoldItalicFont\@empty
  \bgroup
    \setkeys*[xeCJK]{preparse}{#2}
  \egroup
  \edef\xeCJK@Features{}

  \ifxeCJK@BoldFont@
    \ifx\xeCJK@BoldFont\@empty
      \edef\xeCJK@Features{BoldFont={#3},
        BoldFeatures={RawFeature={embolden=\xeCJK@emboldenfactor}}}
    \fi
  \fi

  \ifxeCJK@SlantFont@
    \ifx\xeCJK@ItalicFont\@empty
      \ifx\xeCJK@Features\@empty
        \edef\xeCJK@Features{ItalicFont={#3},
          ItalicFeatures={RawFeature={slant=\xeCJK@slantfactor}}}
      \else
        \edef\xeCJK@Features{\xeCJK@Features,ItalicFont={#3},
          ItalicFeatures={RawFeature={slant=\xeCJK@slantfactor}}}
      \fi
    \fi

    \ifx\xeCJK@BoldItalicFont\@empty
      \ifx\xeCJK@BoldFont\@empty
        \edef\xeCJK@Features{\xeCJK@Features,BoldItalicFont={#3},
          BoldItalicFeatures={RawFeature={embolden=\xeCJK@emboldenfactor,slant=\xeCJK@slantfactor}}}
      \else
        \edef\xeCJK@Features{\xeCJK@Features,BoldItalicFont={\xeCJK@BoldFont},
          BoldItalicFeatures={RawFeature={slant=\xeCJK@slantfactor}}}
      \fi
    \fi
  \fi

  \edef\xeCJK@temp{#2}
  \ifx\xeCJK@temp\@empty
  \else
    \ifx\xeCJK@Features\@empty
      \edef\xeCJK@Features{#2}
    \else
      \edef\xeCJK@Features{\xeCJK@Features,#2}
    \fi
  \fi

  \expandafter\edef\csname xeCJK@font@#1\endcsname{
    \noexpand\fontspec[\xeCJK@Features]{#3}}
  \expandafter\edef\csname xeCJK@fontoptions@#1\endcsname{\xeCJK@Features}
  \expandafter\edef\csname xeCJK@fontname@#1\endcsname{#3}}


\newcount\xeCJK@featureadded
\xeCJK@featureadded=0

\let\xeCJK@addfontfeatures\addfontfeatures
\def\addCJKfontfeatures#1{
  \global\advance\xeCJK@featureadded\@ne
  \ifcsname xeCJK@family\endcsname
    \edef\xeCJK@tempa{\csname xeCJK@fontoptions@\xeCJK@family\endcsname,#1}
    \edef\xeCJK@tempb{\csname xeCJK@fontname@\xeCJK@family\endcsname}
    \edef\xeCJK@tempf{\xeCJK@family @\the\xeCJK@featureadded}
    \expandafter\edef\csname xeCJK@font@\xeCJK@tempf\endcsname{
      \noexpand\fontspec[\xeCJK@tempa]{\xeCJK@tempb}}
    \expandafter\edef\csname xeCJK@fontoptions@\xeCJK@tempf\endcsname{\xeCJK@tempa}
    \expandafter\edef\csname xeCJK@fontname@\xeCJK@tempf\endcsname{\xeCJK@tempb}
    \CJKfamily{\xeCJK@tempf}
  \fi}

\def\addfontfeatures#1{
  \xeCJK@addfontfeatures{#1}
  \addCJKfontfeatures{#1}}


\def\xeCJK@font@rm{}

\DeclareRobustCommand\CJKfamily[1]{
  \ifcsname xeCJK@font@#1\endcsname
    \edef\xeCJK@family{#1}
  \else
    \ifcsname xeCJK@#1@warned\endcsname
    \else
      \PackageWarning{xeCJK}{
        Unknown CJK family `#1' is ignored.^^J
        Use \string\setCJKfamilyfont \space to define a CJK family.}
      \expandafter\gdef\csname xeCJK@#1@warned\endcsname{}
    \fi
  \fi}
\CJKfamily{rm}

\def\xeCJKsetslantfactor#1{\edef\xeCJK@slantfactor{#1}}
\def\xeCJKsetemboldenfactor#1{\edef\xeCJK@emboldenfactor{#1}}

\xeCJKsetslantfactor{0.17}
\xeCJKsetemboldenfactor{4}

\ifxeCJK@num
  \edef\CJK@UnicodeEnc{UTF8}
  \def\CJKaddEncHook#1#2{\expandafter\def\csname xeCJK@enc@#1\endcsname{#2}}
  \def\Unicode#1#2{\@tempcnta #1\relax
    \multiply\@tempcnta 256\relax
    \advance\@tempcnta #2\relax
    \char\@tempcnta}
  \RequirePackage{CJKnumb}
  \csname xeCJK@enc@UTF8\endcsname
  \def\CJK@tenthousand{万}
\fi

\def\CJK@ifundefined#1{
  \ifx #1\@undefined
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}

\newcommand{\xeCJKcaption}[2][]{
  \edef\xeCJK@temp{#1}
  \ifx\xeCJK@temp\@empty
  \else
    \XeTeXdefaultencoding "#1"
  \fi
  \makeatletter
  \input{#2.cpx}
  \makeatother
  \XeTeXdefaultencoding "UTF-8"}

\endlinechar `\^^M
\catcode "FEFF=9\relax
\endinput
%%
%% End of file `xeCJK.sty'.
